<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

		<title>reveal.js</title>

		<link rel="stylesheet" href="css/reveal.css">
		<link rel="stylesheet" href="css/theme/black.css">

		<!-- Theme used for syntax highlighting of code -->
		<link rel="stylesheet" href="lib/css/zenburn.css">

		<!-- Printing and PDF exports -->
		<script>
			var link = document.createElement( 'link' );
			link.rel = 'stylesheet';
			link.type = 'text/css';
			link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
			document.getElementsByTagName( 'head' )[0].appendChild( link );
		</script>
	</head>
	<body>
		<div class="reveal">
			<div class="slides">
				<section>
                    <h2>我的golang开发生态</h2>
                </section>
                <section data-markdown>
                     <script type="text/template">
                     内容
                       - golang生命周期
                       - 问题与改进
                       - 总结
                       - 几乎不涉及语法和代码
                     </script>
                    <aside class="notes">
                        分享golang开发过程中的上下游生态环境，不涉及到具体的代码细节
                    </aside>
                </section>
                <section>
                    <section data-markdown>
                        <script type="text/template">
                            优缺点 <!-- .element: class="h2"  -->
                            * 特点
                              - 静态语言
                              - "高性能"
                              - CSP模型
                            * 优点
                              - 高并发，高性能
                              - 语法简单，强类型检查
                              - C语言亲和
                            * 缺点
                              - 不支持泛型(模板)
                              - 非高并发场景下性能和java相当
                        </script>
                        <aside class="notes">
                            golang 最适合做高并发的后端开发语言
                            静态语言
                            高性能：非高并发场景下性能和java相当，在高并发场景以下，吊打一切其他语言
                            CSP模型相对Actor模型
                        </aside>
                    </section>
                    <section data-markdown>代码
                        <script type="text/template">
                            安装
                            - [官方安装包 storage.googleapis.com/golang](https://storage.googleapis.com/golang)
                            - [多版本切换 github.com/syndbg/goenv](https://github.com/syndbg/goenv)
                            * 环境配置
                                - GOROOT 环境变量，指向Go安装包路径
                                - GOPATH 环境变量，用来安装第三方代码库路径
                                - GCC 如果需要cgo支持，应当安装gcc；windows下使用[MSYS](http://www.mingw.org/wiki/MSYS)或者[MSYS2](http://www.msys2.org/)
                        </script>
                        <aside class="notes">
                            MSYS windows下的一个最小化unix编译环境
                            cygwin, mingw, mingw-w64, MSYS2, MSYS
                        </aside>
                    </section>
                    <section data-markdown>IDE
                        <script type="text/template">
                            # IDE
                            - [LiteIDE]()
                            - [VSCode]()
                            - 其他
                        </script>
                        <aside class="notes">
                            MSYS windows下的一个最小化unix编译环境
                            cygwin, mingw, mingw-w64, MSYS2, MSYS
                        </aside>
                    </section>
                    <section>
                        <img src="images/ide1.png">
                        <aside class="notes">
                        </aside>
                    </section>
                    <section>
                        <img src="images/ide2.png">
                        <aside class="notes">
                        </aside>
                    </section>
                    <section data-markdown>编译
                        <script type="text/template">
                            编译
                            * 安装依赖
                              - go get
                            * 编译 binary one build, run any where
                              - go build
                              - go install
                            * go doc
                        </script>
                        <aside class="notes">
                            Go 是一门语言，也是一个程序go.exe，所以通常我们称之为golang
                        </aside>
                    </section>
                    <section>
                        <p>推荐的构建的脚本</p>
                        <pre>
#!/bin/bash
export GOPATH=$GOPATH:$PWD
APPNAME="mbridge"
RELEASE=0

if [ x$1 == "xrelease" ]; then
	RELEASE = 1
fi

if [ x$2 != "x" ]; then
	APPNAME = $2
fi

if [ 1 -eq $RELEASE ]; then
	go install --ldflags '-s -w' -v "main/$APPNAME"
else
	go install -v "main/$APPNAME"
fi

                        </pre>
                    </section>
                    <section data-markdown>社区
                        <script type="text/template">
                            # 社区
                              - [golang.org](https://golang.org)
                              - [gopkg.in](https://gopkg.in)
                              - [github.com](https://github.com)
                              - [godoc.org](https://godoc.org)
                              - [goreportcard.com](https://goreportcard.com)
                        </script>
                        <aside class="notes">
                            golang.org 官方网站
                            gopkg.in 包管理
                            github.com 代码托管
                            godoc.org 帮助文档
                            goreportcard.com 代码质量
                        </aside>
                    </section>
                    <section data-markdown>质量
                        <script type="text/template">
                            # 质量
                            - go test 模块应当以包为单位编写测试代码<!-- .element: class="text" -->
                              * import "testing"
                              * 单元测试
                              * 性能测试
                            - [go lint](https://github.com/golang/lint)
                                * 代码质量
                        </script>
                        <aside class="notes">
                            自带测试包
                            golang 模块应当以包为单位编写测试代码，性能测试
                        </aside>
                    </section>
                    <section>
                        go test demo
                        <pre>
func TestTimeConsuming(t *testing.T) {
    if testing.Short() {
        t.Skip("skipping test in short mode.")
    }
    ...
}
//result
FAIL/OK

 func BenchmarkHello(b *testing.B) {
    for i := 0; i < b.N; i++ {
        fmt.Sprintf("hello")
    }
}
//result
BenchmarkHello    10000000    282 ns/op
                        </pre>
                        <aside class="notes">
                            自带测试包
                            golang 模块应当以包为单位编写测试代码，性能测试
                        </aside>
                    </section>
                    <section>
                        <p> cgo - golang 直接调用C代码库</p>
                        <pre>
package main

/*
#cgo CFLAGS : -Iinclude
#cgo LDFLAGS: -lm

#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
int printXX() {
	printf(&quot;This C Code!\n&quot;);
}
*/
import &quot;C&quot;
//import &quot;unsafe&quot;

import (
    &quot;fmt&quot;
)

func main() {
	C.printXX()
	fmt.Println(float64(C.sin(C.double(100))))
}
                        </pre>
                        <aside class="notes">
                            需要说明的是：需要安装gcc环境，推荐优先使用静态编译
                            某些场景下，可以使用C语言加速,例如大量的CPU密集型程序(MD5计算，加解密)
                            CGO 双刃剑，代码依赖性强，跨语言交换数据性能低下，如果有大量频繁数据交换不宜使用CGO
                        </aside>
                    </section>
                    <section data-markdown>
                        <script type="text/template">
                        平台相关-golang 特殊名称约定
                          - 目录 vendor
                          - 目录 internal
                          - 目录 main
                          - 目录 src
                          - 目录 pkg
                          - 目录 bin
                          - 文件 xxx_linux.go, xxx_windows.go, xxx_linux_amd64.go
                          - 文件 xxx_test
                          - 函数 TestXXX(t* testing.T)
                          - 函数 BenchmarkXXX(b* testing.B)
                        </script>
                        <aside class="notes">
                        </aside>
                    </section>
                    <section>
                        <p> run - distribute-gosuv <p>
                        <img src="images/gosuv1.png">
                    </section>
                    <section data-markdown>docker
                        <script type="text/template">
                            性能的度量
                              * go pprof
                              * [go-torch 火焰图](https://github.com/uber/go-torch)
                              * metric 性能可视化
                                - CPU
                                - go routine
                                - memory
                                - stack
                                - any expvar
                        </script>
                        <aside class="notes">
                            演示 火焰图
                        </aside>
                    </section>
                    <section>
                        mbridge torch
                        <img src="images/flamegraph.png">
                        <aside class="notes">
                            演示
                        </aside>
                    </section>
                    <section>metricbeat - golang heap1
                        <img src="images/golang_heap.png">
                        <aside class="notes">
                            演示 mericbeat golang heap
                        </aside>
                    </section>
                    <section>metricbeat - golang heap2
                        <img src="images/golang_heap2.png">
                        <aside class="notes">
                            演示 mericbeat golang heap
                        </aside>
                    </section>
                    <section>
                        原理
                        <img src="images/metricbeates_.png">
                    </section>
                    <section>metricbeat - golang code
                        <pre>
import "expvar"
var kafkaRxExpvar = expvar.NewInt("kafka_rx")
...
func (k *Kafkagroup) process(v []byte, partionId int) error {
	kafkaRxExpvar.Add(1)
	rcd, err := k.h.NewRecord(v, partionId)
	if err == nil {
		k.h.Input() <- rcd
	}
	return nil
}
                        </pre>
                    </section>
                    <section>docker
                        <p>Dockerfile</p>
                        <pre>
FROM alpine:3.7
## fix golang link
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
ARG appname=jtrd
# Add jtrd
RUN mkdir -p /${appname} && COPY ${appname} /$appname/ && COPY VERSION /$appname/
WORKDIR /${appname}
ENTRYPOINT ["./${appname}"]
CMD ["--help"]
                        </pre>
                        <p>builddocker.sh</p>
                        <pre>
#!/bin/bash
go build -ldflags "-X main.Version=$(cat VERSION) -X main.BuildTime=$(date -u +%Y%m%d)" -v
sudo docker build -t "sort/jtrd:$(cat VERSION)" -f Dockerfile .
                        </pre>
                        <aside class="notes">
                        </aside>
                    </section>
                    <section>
                        consul 微服务-分布式
                        <img src="images/consul1.png">
                    </section>
                    <section>
                        consul 微服务-分布式
                        <img src="images/consul2.png">
                    </section>
                    <section>
                        <video>
                            <source data-src="https://consul-static-asssets.global.ssl.fastly.net/videos/v1/connect-video-ui.mp4" type="video/mp4" />
                        </video>
                    </section>
                    <section>
                        consul 微服务-应用
                        <img src="images/consul.png">
                    </section>
                    <section>
                        <h3>consul-template</h3>
                        <pre>
upstream bridge{ {{ range service "yxbridge" }}
	server {{.Address}}:{{.Port}}; {{ end }}
}
    server {
        listen       80;
        server_name  bridge.xxx.com;

        #charset koi8-r;

        error_log  logs/bridge.error;
        access_log  logs/bridge.access;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Origin "";

        location / {
		#proxy_set_header   Authorization "";
		proxy_pass http://bridge/;
        }
}
                        </pre>
                        <pre>
consul-template -template yxbridge.tmpl:/nginx/conf/vhost/yxbridgecorp.conf:nginx -s reload
                        </pre>
                    </section>
                    <!--
                    <section data-markdown>docker
                        <script type="text/template">
                        consul - sidecar 模式 分布式服务
                          - 服务注册与发现
                          - 统一配置
                          - 分布式存储
                          - 分布式锁
                          - *服务分割
                        </script>
                    </section>
                    -->
                    <section>
                        消息队列 - nsq VS kafka
                        <div class="columns">
                            <div class="row">
                                <img src="images/nsq.png" width="50%">
                            </div>
                            <div class="row">
                                <img src="images/kafka.png" width="50%">
                            </div>
                        </div>
                    </section>
                    <section data-markdown>docker
                        <script type="text/template">
                        最常用Go 开源库
                          - [gin Web框架](https://github.com/gin-gonic/gin)
                          - [go-redis Redis](https://github.com/go-redis/redis)
                          - [xorm SQL ORM](https://xorm.io)
                          - [logrus 日志](https://github.com/sirupsen/logrus)
                            - logrus to elasitcsearch
                        </script>
                    </section>
                    <section><h2>Cycle - CI/CD</h2>
                        <img src="images/ci_cd2.png">
                    </section>
                </section>
                <section>问题与改进
                    <section data-markdown>docker
                        <script type="text/template">
                        run - distribute-gosuv
                        - 分组
                        - CD 远程升级API
                        - CD 远程下载
                        - CD rollback
                        - build.sh push hook
                        </script>
                    </section>
                    <section>
                        <h2>Cycle - CI/CD</h2>
                        <img src="images/ci_cd5.png" width="%50">
                    </section>
                    <section>
                        <img src="images/consul-docker.png">
                    </section>
                </section>
                <section>
                    <section>
                        <h2>总结 stack</h2>
                        <img src="images/consulstack.png">
                    </section>
                    <section>
                        <h2>总结 teck</h2>
                        <img src="images/sumtech.png">
                    </section>
                    <section>
                        <h2>总结 关键词</h2>
                        <p>CSP</p>
                        <p>sidecar</p>
                        <p>service discovery</p>
                        <p>distribute</p>
                        <p>运维简便</p>
                        <p>实用</p>
                        <p>简单</p>
                    </section>
                    <section>
                        <h2>总结 思想</h2>
                        <p>世界是并行的</p>
                        <p>少即是多：有且仅有一种方法把事情做好做对</p>
                        <p>简单，模块化，可组合</p>
                        <p>实用主义</p>
                        <aside class="notes">
                            简单，模块化，可组合的方法使我们能够在更高的抽象层次上构建产品。我们不是解决整体问题，而是将其分解为组成部分，并解决这些问题。
                            我们为每个问题的范围构建最佳解决方案，然后组合块以形成可靠的完整解决方案。

                            实用主义
                            在接近任何问题时，我们坚信实用主义的价值。
                            我们所信仰的许多原则，如不变性，编纂，自动化和CSP，都是我们渴望的理想，而不是我们教条所强加的要求。
                            在许多情况下，实际的解决方案需要重新评估我们的理想。
                            实用主义使我们能够评估新的想法，方法和技术，以及如何采用它们来改善HashiCorp的最佳实践。
                            认为这是对第一原则的妥协，而是开放思想和谦虚接受我们可能是错误的，这是错误的。
                            适应能力对创新至关重要，我们为此感到自豪。
                        </aside>
                    </section>
                </section>
			</div>
		</div>

		<script src="lib/js/head.min.js"></script>
		<script src="js/reveal.js"></script>

		<script>
			// More info about config & dependencies:
			// - https://github.com/hakimel/reveal.js#configuration
			// - https://github.com/hakimel/reveal.js#dependencies
			Reveal.initialize({
				dependencies: [
					{ src: 'plugin/markdown/marked.js' },
					{ src: 'plugin/markdown/markdown.js' },
					{ src: 'plugin/notes/notes.js', async: true },
					{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
				]
			});
		</script>
	</body>
</html>
